#ifndef _INPUT_MANAGER_H
#define _INPUT_MANAGER_H

#include <sys/time.h>
#include <pthread.h>

//事件类别
#define INPUT_TYPE_STDIN    0
#define INPUT_TYPE_TOUCHSRCEEN 1

typedef struct InputEvent{
    struct timeval tTime;   //发生事件时间
    int iType;  //类别
    int iX; //x/y坐标
    int iY;
    int iKey;   //按键值
    int iPressure   //压力值
}T_InputEvent, *PT_InputEvent;


typedef struct InputOpr{
    char *name; //输入模块的名字
    pthread_t tTreadID; //子线程的名字
    int (*DeviceInit)(void);    //初始化函数
    int (*DeviceExit)(void);    //设备退出函数
    int (*GetInputEvent)(PT_InputEvent ptInputEvent);   //获得输入数据
    struct InputOpr *ptNext;    
}T_InputOpr, *PT_InputOpr;


//  * 功能描述： 调用各个输入模块的初始化函数,就是注册各个输入模块
//  * 返 回 值： 0 - 成功, 其他值 - 失败
int InputInit(void);

// * 功能描述： 注册"输入模块"
//  * 输入参数： ptInputOpr - 输入模块的结构体指针
//  * 输出参数： 无
//  * 返 回 值： 0 - 成功, 其他值 - 失败
int RegisterInputOpr(PT_InputOpr ptInputOpr);

//  * 功能描述： 显示本程序能支持的"输入模块"
void ShowInputOpr(void);

//  * 功能描述： 调用所有"输入模块"的设备相关的初始化函数
//  *            并创建用于读取输入数据的子线程
// * 返 回 值： 0 - 成功, 其他值 - 失败
int AllInputDevicesInit(void);

//  * 功能描述： 获得输入数据,它会使得当前线程休眠,
//  *            当各输入模块的子线程读到数据后会把它唤醒
//  * 输出参数： ptInputEvent - 内含得到的输入数据
//  * 返 回 值： 0 - 成功
int GetInputEvent(PT_InputEvent ptInputEvent);

//  * 功能描述： 注册"标准输入模块"
//  * 返 回 值： 0 - 成功, 其他值 - 失败
int StdInit(void);

//  * 功能描述： 注册"触摸屏输入模块"
//  * 返 回 值： 0 - 成功, 其他值 - 失败
int TouchScreenInit(void);

#endif /* _INPUT_MANAGER_H */